package top.milkbox.core;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 控制台日志
 */
public class UtilsLog {
    /*
         注意：需要jackson依赖，maven依赖如下
         <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-core</artifactId>
         <version>2.12.5</version>
         </dependency>

         <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-databind</artifactId>
         <version>2.12.5</version>
         </dependency>

         <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-annotations</artifactId>
         <version>2.12.5</version>
         </dependency>
     */

    // 默认后缀
    public static final String LENGTH_LIMIT_SUFFIX = "(省略)......";
    // 默认长度
    public static final int LENGTH_LIMIT = 64;

    /**
     * 限制字符串的长度，截取指定长度的字符串并返回，在结尾添加后缀
     *
     * @param source 原字符串
     * @param limit  限制的最大长度
     * @param suffix 后缀
     * @return 返回String
     */
    public static String lengthLimit(String source, int limit, String suffix) {
        return source.length() <= limit ? source : source.substring(0, limit) + suffix;
    }

    /**
     * 限制长度
     *
     * @param source 原字符串
     * @param limit  限制的最大长度
     * @return 返回String
     */
    public static String lengthLimit(String source, int limit) {
        return lengthLimit(source, limit, LENGTH_LIMIT_SUFFIX);
    }

    /**
     * 限制长度默认64
     *
     * @param source 原字符串
     * @return 返回String
     */
    public static String lengthLimit(String source) {
        return lengthLimit(source, LENGTH_LIMIT);
    }

    /**
     * 打印日志
     *
     * @param source     日志的来源
     * @param logMessage 日志的信息
     */
    public static void log(String source, String logMessage) {
        System.out.println("log from " + source + ": " + logMessage);
    }

    /**
     * 将对象转换为json字符串，并且格式化
     *
     * @param object 可以将任意对象传入
     * @return 返回json字符串
     */
    public static String getPrettyJson(Object object) {
        String json = "";
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return json;
    }

    /**
     * 格式化打印对象，以json字符串的形式
     *
     * @param source 日志的来源
     * @param object 要打印的对象
     */
    public static void logPrettyJson(String source, Object object) {
        log(source, "");
        System.out.println(getPrettyJson(object));
    }
}
